let path = require('path')
let fs = require('fs')
class FileLint {
  constructor() {
    this.init()
  }
  print(color, msg) {
    let map = {
      bright: '\x1B[1m', // 亮色
      grey: '\x1B[2m', // 灰色
      italic: '\x1B[3m', // 斜体
      underline: '\x1B[4m', // 下划线
      reverse: '\x1B[7m', // 反向
      hidden: '\x1B[8m', // 隐藏
      black: '\x1B[30m', // 黑色
      red: '\x1B[31m', // 红色
      green: '\x1B[32m', // 绿色
      yellow: '\x1B[33m', // 黄色
      blue: '\x1B[34m', // 蓝色
      magenta: '\x1B[35m', // 品红
      cyan: '\x1B[36m', // 青色
      white: '\x1B[37m', // 白色
      blackBG: '\x1B[40m', // 背景色为黑色
      redBG: '\x1B[41m', // 背景色为红色
      greenBG: '\x1B[42m', // 背景色为绿色
      yellowBG: '\x1B[43m', // 背景色为黄色
      blueBG: '\x1B[44m', // 背景色为蓝色
      magentaBG: '\x1B[45m', // 背景色为品红
      cyanBG: '\x1B[46m', // 背景色为青色
      whiteBG: '\x1B[47m' // 背景色为白色
    }
    console.log(map[color] || map['bright'], msg, '\x1b[0m')
  }
  resolve(p) {
    return path.resolve(__dirname, p)
  }
  async init() {
    let retA = await this.checkEnvPort()
    let retB = await this.checkServerIndex()
    let retC = await this.checkEcosytemConfigFile()
    let ret = [...retA, ...retB, ...retC]
    if (ret.length) {
      this.print('red', ret.join('\n'))
      process.exit(1)
    }
  }
  // 检测env.js和envDefault里面的port和processTitle是否合法
  async checkEnvPort() {
    let pA = this.resolve('../config/env.js')
    let pB = this.resolve('../config/envDefault.js')
    let contentA = fs.readFileSync(pA).toString()
    let contentB = fs.readFileSync(pB).toString()
    let errors = []
    if (!contentA.match(/["']zl_web["']/g)) {
      errors.push(`在env.js中未检测到合法的进程名称{'zl_web'}，请修改后才能提交。`)
    }
    if (!contentB.match(/["']zl_web["']/g)) {
      errors.push(`在envDefault.js中未检测到合法的进程名称{'zl_web'}，请修改后才能提交。`)
    }
    if (!contentA.match(/port\s*:\s*3002/g)) {
      errors.push(`在env.js中未检测到合法的端口{port: 3002}，请修改后才能提交。`)
    }
    if (!contentB.match(/port\s*:\s*3002/g)) {
      errors.push(`在envDefault.js中未检测到合法的端口{port: 3002}，请修改后才能提交。`)
    }

    return errors
  }
  // 检查这个文件的middlewares变量是否齐全，通过检测“redirectPath”的数量，若为1个，则视为非法
  async checkServerIndex() {
    let pA = this.resolve('../server/index.js')
    let content = fs.readFileSync(pA).toString()
    let rs = content.match(/redirectPath/g)
    let errors = []
    if (!rs || rs.length < 2) {
      errors.push(`在server/index.js的middlewares中redirectPath中间件未被使用，请修改后才能提交。`)
    }
    return errors
  }
  async checkEcosytemConfigFile() {
    let pA = this.resolve('../ecosystem.config.js')
    let content = fs.readFileSync(pA).toString()
    let reg = /name\s*:\s*['"]zl_web['"]/g
    let rs = content.match(reg)
    let errors = []
    if (!rs) {
      errors.push(`在ecosystem.config.js的name值应为“zl_web”，请修改后才能提交。`)
    }
    return errors
  }
}

new FileLint()
